Retour à la page d’accueil

Dans cette partie du cours vous allez apprendre à restructurer des tables dans R. Ces changement sont parfois nécessaire pour mettre les données dans le format adapté au graphique que vous voulez réaliser.

Aujourd’hui nous allons voir comment:

  • Ajouter ou modifier des colonnes

  • Reformater des données

  • Combiner plusieurs tableaux en un seul

  • Ordonner les valeusr d’une colonne

  • Exporter le nouveau tableau créé dans R

Tout d’abord, créez un nouveau script R et préparez votre environnement de travail:

# Chargez la librairie `tidyverse`

# Changez votre répertoire de travail pour être dans `session3_plots_reorganisation`

# Importer `burghardt_et_al_2015_expt1.txt` et mettez le dans un objet appelé `expt1`


Modifier ou ajouter des colonnes avec mutate()

La fonction mutate() permet d’ajouter de nouvelles vatiables (i.e. nouvelles colonnes) dans une table, ou de modifier des colonnes déjà existantes.

source de l’image

Par exemple, ajoutons une colonne leaf.length.cm qui va contenir la longueur des feuilles en cm. Pour cela nous devons créer une nouvelle colonne en utilisant la colonne leaf.length.mm qui existe dans la table.

# Créez une nouvelle table avec la colonne supplémentare  
expt1.cm <- mutate(expt1, total.leaf.length.cm = total.leaf.length.mm/10)

# Vérifier que la nouvelle colonne est bien là
colnames(expt1.cm)
##  [1] "plant_nb"             "genotype"             "background"          
##  [4] "temperature"          "fluctuation"          "day.length"          
##  [7] "vernalization"        "survival.bolt"        "bolt"                
## [10] "days.to.bolt"         "days.to.flower"       "rosette.leaf.num"    
## [13] "cauline.leaf.num"     "blade.length.mm"      "total.leaf.length.mm"
## [16] "blade.ratio"          "total.leaf.length.cm"

Nous pouvons aussi créer et modifier plus d’une colonne à la fois, en les séparant pas une virgule (,) dans la fonction mutate():

# Créez deux nouvelles colonnes
expt1.cm <- mutate(expt1, 
                   blade.length.cm = blade.length.mm/10,
                   total.leaf.length.cm = total.leaf.length.mm/10)

# Vérifier que les nouvelles colonnes sont bien là
colnames(expt1.cm)
##  [1] "plant_nb"             "genotype"             "background"          
##  [4] "temperature"          "fluctuation"          "day.length"          
##  [7] "vernalization"        "survival.bolt"        "bolt"                
## [10] "days.to.bolt"         "days.to.flower"       "rosette.leaf.num"    
## [13] "cauline.leaf.num"     "blade.length.mm"      "total.leaf.length.mm"
## [16] "blade.ratio"          "blade.length.cm"      "total.leaf.length.cm"

Attention!! Si vous utilisez le nom d’une colonne déjà existante, vous allez la modifier et non créer une nouvelle colonne.

Concatener ou séparer des colonnes avec unite() et separate()

Pour concantener deux ou plusieurs colonnes ensemble, utilisez la fonction unite(). Par exemple, pour concaténer vernalization, survival.bolt et bolt:

# Créez deux nouvelles colonnes
expt1.concatenated <- unite(expt1, "Vern_survival_bolt",vernalization,survival.bolt,bolt)

# Vérifier que la nouvelles colonnes sont bien là
colnames(expt1.concatenated)
##  [1] "plant_nb"             "genotype"             "background"          
##  [4] "temperature"          "fluctuation"          "day.length"          
##  [7] "Vern_survival_bolt"   "days.to.bolt"         "days.to.flower"      
## [10] "rosette.leaf.num"     "cauline.leaf.num"     "blade.length.mm"     
## [13] "total.leaf.length.mm" "blade.ratio"

A contrario, pour séparer une colonne en deux ou plusieurs colonnes, utilisez la fonction separate(). Par exemple, pour séparer la colonne barkground :

# Créez deux nouvelles colonnes
expt1.separated <- separate(expt1, background, into=c("genotype", "FRI mutation"))

# Vérifier que la nouvelles colonnes sont bien là
colnames(expt1.separated)
##  [1] "plant_nb"             "temperature"          "genotype"            
##  [4] "FRI mutation"         "fluctuation"          "day.length"          
##  [7] "vernalization"        "survival.bolt"        "bolt"                
## [10] "days.to.bolt"         "days.to.flower"       "rosette.leaf.num"    
## [13] "cauline.leaf.num"     "blade.length.mm"      "total.leaf.length.mm"
## [16] "blade.ratio"



Exercice:

Reproduisez cette figure de Burghard et al 2015

Aide:

  • Créez une nouvelle colonne avec le ratio de blade.length.mm et total.leaf.length.mm

  • Créez une nouvelle colonne (nommée par exemple condition) en concaténant day.length, temperature et fluctuation

  • Sélectionnez les background Col et Ler

  • Faites un boxplot du ratio de blade.length.mm et total.leaf.length.mm en fonction de la condition, en créant des facets en fonction du background

  • Pas besoin de mettre de la couleur qui n’apporte rien au graphique


Reformater des données avec spread() et gather()

Parfois, le format de vos données ne vous permet pas de faire l’analyse ou le graphique que vous voulez.

Par exemple, essayons de reproduire le graphique suivant extrait de Burghard et al 2015

Pour faire cette figure il nous faut une colonne avec le temps de floraison pour les plantes en conditions constante et une autre colonne avec le temps de floraison pour les plantes en condition variable. Le temps de floraison pour toutes les plantes sont dans la même colonne dans notre tableau. Par contre, l’information sur le type de traitement (variable ou constant) est dans une autre colonne. Ce n’est pas ce que nous voulons! Heureusement, nous pouvons utiliser la fonction spread() pour reformater notre tableau.

Pour y voir plus clair, ne gardons que les colonnes qui vons nous être utile à la création du tableau:

expt1_subset <- select(expt1, plant_nb:vernalization, days.to.bolt)

Maintenant nous devons changer la structure de la table pour avoir une colonne avec le temps de floraison pour les plantes en conditions constante et une autre colonne avec le temps de floraison pour les plantes en condition variable. Un peu comme dans le schéma ci-dessous (pour aller du format “long” au format “wide”).

La fonction spread() a besoin de deux informations:

  • Le nom de la colonne qui va permettre de créer les noms de colonnes dans la nouvelle table. Dans notre cas fluctuation

  • Le nom de la colonne qui contient les valeurs qui vont remplir les nouvelles colonnes. Dans notre cas days.to.bolt

Voici comment re-structure notre tableau avec spread():

expt1_wide <- spread(expt1_subset, key=fluctuation, value = days.to.bolt)

Afin de pouvoir reproduire les couleurs du graphique, nous devons concatener les colonnes temperature et day.length. Et nous pouvons enfin faire le graphique:

unite(expt1_wide, "treatment", temperature, day.length) %>% 
ggplot(aes(x=Con, y=Var, color=treatment)) +
  geom_point()
## Warning: Removed 51 rows containing missing values (geom_point).

Comme vous avez vu, changer la structure du tableau nous a permis de faire un graphique que nous n’aurions pas pu faire autrement. Cela peut aussi permettre de faire des analyses supplémtaires.



A l’inverse la fonction gather() permet de passer d’un format “wide” à un format “long”.

Dans ce cas, le nom des colonnes sélectionnées devient la “clé”, c’est à dire les catégories dans la première colonne crée (en violet dans l’illustration). Et les valeurs de toutes ces colonnes sélectionnées vont remplir la deuxième colonne crée (en blue dans l’illustration).

Imaginons que nous souhaitons faire un boxplot pour le days.to.bolt et le days.to.flower. Il nous faut réorganiser le tableau pour avoir les données pour ces deux mesures dans la même colonnes (trait) et une colonne indiquant s’il s’agit de la mesure de days.to.bolt ou days.to.flower (time.in.days).

gather() à besoin de trois informations:

  • le nom de la nouvelle colonne contenant les nom des vieilles colonnes (dans notre cas trait)

  • le nom de la nouvelle colonne contenant les valeurs des anciennes colonnes (dans notre cas time.in.days)

  • le nom des anciennes colonnes que l’ont veut rassembler

Voici comment re-structure notre tableau avec gather():

expt1_long <- gather(expt1, "trait", "time.in.days", days.to.bolt, days.to.flower)

Nous pouvons maintenant faire notre boxplot

ggplot(expt1_long, aes(x=trait, y=time.in.days, color=genotype)) +
  geom_boxplot()
## Warning: Removed 83 rows containing non-finite values (stat_boxplot).

Exercice:

Utilisez la fonction gather() pour restructurer le tableau afin de faire un boxplot de blade.length.mm et total.leaf.length.mm, coloré par la température